import axios from 'axios';
import { message } from 'antd';

import { API_BASE_URL, API_TIMEOUT } from '../constants';

// 创建 axios 实例
const api = axios.create({
    baseURL: API_BASE_URL,
    timeout: API_TIMEOUT,
    headers: {
        'Content-Type': 'application/json'
    }
});

// 请求拦截器
api.interceptors.request.use(
    (config) => {
        // 在发送请求之前做些什么，例如添加 token
        const token = localStorage.getItem('token');

        if (token) {
            // 确保token带有Bearer前缀
            config.headers.Authorization = token.startsWith('Bearer ') ? token : `Bearer ${token}`;
        }
        return config;
    },
    (error) => {
        return Promise.reject(error);
    }
);

// 响应拦截器
api.interceptors.response.use(
    (response) => {
        // 处理成功响应
        const { data } = response;

        // 如果响应中包含token，保存它
        if (data.token) {
            const token = data.token.startsWith('Bearer ') ? data.token : `Bearer ${data.token}`;
            localStorage.setItem('token', token);
            console.log('保存新token:', token);
        }

        // 处理响应数据
        if (data.success === false) {
            // 如果服务器明确返回success: false，显示错误信息
            message.error(data.msg || '操作失败');
            return Promise.reject(new Error(data.msg || '操作失败'));
        }

        // 显示成功消息（如果有）
        if (data.msg && !window.location.pathname.includes('/canvas/')) {
            message.success(data.msg);
        }

        return data;
    },
    (error) => {
        // 处理错误响应
        if (error.response) {
            const { status, data } = error.response;

            switch (status) {
                case 401:
                    // 未授权，清除token并显示错误消息
                    localStorage.removeItem('token');
                    localStorage.removeItem('userId');
                    localStorage.removeItem('username');
                    message.error(data.msg || '请先登录');
                    break;
                case 403:
                    message.error(data.msg || '权限不足');
                    break;
                case 404:
                    message.error(data.msg || '请求的资源不存在');
                    break;
                case 500:
                    message.error(data.msg || '服务器错误');
                    break;
                default:
                    message.error(data.msg || error.message || '请求失败');
            }
        } else if (error.request) {
            message.error('无法连接到服务器，请检查网络连接');
        } else {
            message.error(error.message || '请求出错');
        }
        return Promise.reject(error);
    }
);

export default api;
